{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "### 1. 画图解释图像卷积滤波的基本原理，并进一步简述常见的图像平滑滤波算法。 \n",
    "![图像卷积滤波](https://gitee.com/coolhenry/cv-week-2/raw/master/image/convolution.png)<br/>\n",
    "如图所示， 对于原图中的每个像素，计算它的邻域若干个像素和滤波器矩阵中对应元素的乘积，再把这些乘积加起来，作为目标图中的对应像素值，这样的过程称为卷积滤波。<br/>\n",
    "这个过程有点类似平滑的地面上耸立着两座山峰，看起来很显眼，对于图像来说，就可能是一些高频的噪点，鉴于大部分图像本身具有局部相关性，或者说人眼能够处理的图像大部分具有局部相关性，所以可以采用将两座山峰削平的方式来进行平滑处理，削平过程中得到的土，平摊到周围区域。<br/>\n",
    "可以看到，这样做的过程中，目标中每个像素的值，不仅包含原图中对应像素的信息，也包含了原图中该像素的邻域像素的信息，而且这些信息是通过加权求和的方式组合起来的。可以看出，目标图像应该比原图更加平滑，因为通过加权求和的方式，一些高频的噪点信息，会被周围的像素给平均掉，具体平均到什么程度，取决于滤波器矩阵的设置。<br/>\n",
    "常见的图像滤波平滑算法有平均滤波、加权平均滤波、中值滤波、高斯滤波；<br/>\n",
    " + 平均滤波的目标像素的灰度值是对应像素的邻域像素的平均值，这样出来的结果可能会比较模糊；\n",
    " + 加权平均滤波的目标像素的灰度值是对应像素的邻域像素的加权平均值，这样出来的结果可能比较模糊；\n",
    " + 中值滤波的做法是: 确定滤波窗口大小和位置，窗口内像素按大小顺序排成一列，取中间值代替原来窗口中心的像素值，这种做法，对于去除椒盐噪声颇有效果；\n",
    " + 高斯滤波的做法是：滤波窗口具有以下特点:\n",
    "\t+ 滤波器矩阵的大小为奇数， 如3\\*3，5\\*5等;\n",
    "\t+ 滤波器元素之和为1，这是为了保证滤波前后图像的亮度保持不变；\n",
    "\t+ 对于滤波后的像素，可能出现负数或者超过255的情形，对于这种情况，可以直接将它截断到0~255即可，对于负数，也可以取绝对值；\n",
    "\n",
    "高斯滤波器的图像平滑效果较为具有普适性。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. 简述边缘检测的基本原理，以及Sobel、LoG和Canny算子的原理差异。\n",
    "边缘检测的基本原理，就是将其周围像素灰度有阶跃变化的像素检测出来，这些像素组成的集合就是该图像的边缘，\n",
    "借用高数中极值点的特性，图像的边缘，一般呈现为灰度变化曲线中\n",
    "   + 局部由大到小再到大的点;\n",
    "   + 局部由小到大再到小的点;\n",
    "   + 局部峰值点;\n",
    "   + 局部谷底点。\n",
    "\n",
    "这些点可以通过考察每个像素在某个领域内灰度的变化，通过求一阶差分的极大值或极小值，或者二阶差分的过零点求得，\n",
    "再通过这些点，试图连接起来，就得到一个个的边缘。<br/><br/>\n",
    "#### Sobel算子\n",
    "![Sobel算子](https://gitee.com/coolhenry/cv-week-2/raw/master/image/sobel.png)\n",
    "图示分别为Sobel对应于垂直和水平方向的算子。\n",
    "\n",
    "在技术上，它是一个离散差分算子，在图像中任何一点使用此算子，将会产生对应的灰度矢量或者灰度法向量。\n",
    "对于图左的垂直方向的算子，将之与图像进行平面卷积，即可得出纵向边缘检测的图像灰度值；图右同理，可得出横向边缘检测的图像灰度值，\n",
    "如下图所示:<br/>\n",
    "![Sobel算子计算过程](https://gitee.com/coolhenry/cv-week-2/raw/master/image/sobel_2.png)\n",
    "最终通过计算Gx和Gy平方和再求平方根的方式，计算出每一点的灰度的大小。\n",
    "通常为了减少计算量，采用Gx和Gy绝对值之后来近似求得G。\n",
    "然后判定G大于某一阈值的点，即认为是边缘。\n",
    "Sobel算子根据像素点上下左右邻点灰度加权差，在边缘处达到极值这一现象来检测边缘；\n",
    "对噪声具有平滑作用，提供可以接受的边缘信息。缺点是边缘定位的精度不够高。\n",
    "\n",
    "参考链接:  [Sobel算子原理与实现](https://blog.csdn.net/qq_37124237/article/details/82183177)\n",
    "\n",
    "#### LoG算子\n",
    "首先引入Laplace算子<br/>\n",
    "![Laplace算子](https://gitee.com/coolhenry/cv-week-2/raw/master/image/laplace.png)\n",
    "它的原理是通过求灰度变化曲线二阶微分的过零点，来检测边缘。但由于二阶差分检测的方法噪声过大，所以引入了高斯平滑来消噪。\n",
    "消除噪声后，再使用Laplace算子进行边缘检测。常见的二维高斯函数如下：\n",
    "![Gaussian方程](https://gitee.com/coolhenry/cv-week-2/raw/master/image/gaussian.png)\n",
    "![LoG算子](https://gitee.com/coolhenry/cv-week-2/raw/master/image/log.png)\n",
    "\n",
    "这样得出的曲线，是一个帽顶凹陷向下的墨西哥草帽的形状，他的横切面是圆形，可以有效的实现极值点或局部极值点区域的检测。\n",
    "![LoG算子曲线图](https://gitee.com/coolhenry/cv-week-2/raw/master/image/log_func.jpg)\n",
    "\n",
    "#### Canny算子\n",
    "Canny边缘检测是从不同视觉对象中提取有用的结构信息并大大减少要处理的数据量的一种技术，边缘检测的一般标准包括：\n",
    " + 低的错误率检测边缘，尽可能准确的捕获图像中尽可能多的边缘;\n",
    " + 检测到的边缘应精确定位在真实边缘的中心;\n",
    " + 图像中给定的边缘应只被标记一次，可能的话，尽量不让噪声形成假的边缘。\n",
    "\n",
    "为了满足这些要求，Canny使用了变分法。\n",
    "其处理流程是:\n",
    " + 使用高斯滤波器，平滑图像，滤除噪声;\n",
    " + 计算图像中每个像素点的梯度、强度和方向;\n",
    " + 应用非极大值抑制, 消除边缘检测带来的杂散效应;\n",
    " + 应用双阈值检测来确定真实的和潜在的边缘;\n",
    " + 通过抑制孤立的弱边缘最终完成边缘检测。\n",
    "参考链接 [Canny算子介绍](https://www.cnblogs.com/techyan1990/p/7291771.html)\n",
    "\n",
    "#### 原理差异分析\n",
    "可以看到\n",
    "Sobel的核心原理是一阶差分求极值点来检测边缘;\n",
    "LoG算子的核心原理是高斯去噪后，由二阶差分求过零点来检测边缘;\n",
    "Canny算子的核心是使用变分法，先是通过高斯平滑去噪，再通过计算梯度、强度和方向、再引入了非极大值抑制来让边缘检测结果变细、接着使用双阈值检测来去除假边缘。\n",
    "\n",
    "三个算子的共同点，是局部性；\n",
    "三个算子的效果上来看，Canny算子的检测边缘最细，LoG的检测边缘最粗。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. 简述图像直方图的基本概念，及使用大津算法进行图像分割的基本原理。 \n",
    "#### 图像直方图的基本概念\n",
    "灰度直方图，是将图像中所有像素点的灰度值做一个统计，然后以横轴为灰度值，纵轴为该灰度值出现频率的百分比，画出的一个直方图。\n",
    "灰度直方图表达了灰度值出现的概率密度函数。\n",
    "\n",
    "它适合于灰度分布比较均匀的图像，\n",
    "+ 对于对比度低的图像，直方图在灰度横轴上分布在一个狭窄的区域内;\n",
    "+ 对于对比度高的图像，直方图在灰度横轴上分布在比较宽的区域，噪声也会占据重要的比例。\n",
    "\n",
    "基于灰度阈值进行图像分割的方法，\n",
    "+ 隐含的假设情况为:\n",
    "图像中的目标区和背景区之间，不同的目标区之间，存在差异较大的灰度值或平均灰度值；\n",
    "+ 一般流程为：\n",
    "凡是灰度值处于某个范围z的像素，都变成某一指定灰度值z(a),其他的像素，都变成某一指定灰度值z(b),\n",
    "这样该图像就按照灰度值被分为两个区域。流程的目的，就是找到最佳阈值，使得背景和目标之间的差异最大。\n",
    "\n",
    "#### 大津算法的基本原理\n",
    "记\n",
    "M = 256单通道灰度分级\n",
    "Sum = 像素总数\n",
    "\n",
    "背景像素占比 w(0) = N(0) / Sum\n",
    "前景像素占比 w(1) = 1 - w(0) = N(1) / Sum = 1 - N(0) / Sum\n",
    "背景的平均灰度值 m(0) = m(t) / w(0)\n",
    "前景的平均灰度值 m(1) = (m - m(t)) / w(1)\n",
    "0 ~ M 灰度区间的灰度累计值 m = m(0) * w(0) + m(1) * w(1)\n",
    "类间方差 g = w(0) * (m(0) - m) ^ 2 + w(1) * (m(1) - m) ^ 2\n",
    "由于w(0) + w(1) = 1\n",
    "所以可以化简\n",
    "g = w(0)w(1)[m(1) - m(0)]^2\n",
    "g称之为类间方差，大津算法的实现步骤，就是为m取值遍历[0~255]，根据每个m取值，算出m(1)和m(2)，以及w(0)和w(1)的取值，从而算出g取值，\n",
    "进而找到g最大取值，即得到了最佳阈值m.\n",
    "\n",
    "大津算法的局限性: 对于噪声较大的图像，分割结果噪声较大；对于灰度渐变的图像，分割结果会失真。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. 简述Harris算子对角点的定义，进行角点检测的基本原理，并说明引入角点响应函数的意义。 \n",
    "图像的角点检测，是指检测出图像中存在的夹角点，角点检测要对以下几何变换具有稳定性：\n",
    "+ 旋转\n",
    "+ 缩放\n",
    "+ 仿射\n",
    "+ 灰度变化\n",
    "\n",
    "性能较好的角点检测，应该具有以下特点:\n",
    "+ 检测出图像中“真实”的角点；\n",
    "+ 准确的定位性能；\n",
    "+ 很高的重复检测率；\n",
    "+ 对于噪声的鲁棒性；\n",
    "+ 较高的计算效率。\n",
    "\n",
    "Harries算子思想:\n",
    "角点原理来源于人眼对角点的感性判断，即图像在该点向各个方向灰度均发生明显变化。算法的核心是利用局部窗口在图像上进行移动判断灰度发生较大的变化，人往各个方向移动移动特征的小窗口，如果窗口内区域的灰度发生了较为明显的变化，就认为在小窗口内遇到了角点；否则认为小窗口内没有角点；如果小窗口向某一方向移动时，窗口内灰度发生了明显的变化，而在其他方向没有这种变化，可以认为窗口内包含着一条线段。\n",
    "\n",
    "公式：\n",
    "定义灰度积分变化\n",
    "![Harries灰度积分变化](https://gitee.com/coolhenry/cv-week-2/raw/master/image/harries_1.png)\n",
    "其中w(x,y)表示像素格的灰度权重，越靠近窗口中心，权重越大。\n",
    "\n",
    "为了简化计算，采用泰勒级数近似\n",
    "![Harries灰度积分变化的泰勒级数近似](https://gitee.com/coolhenry/cv-week-2/raw/master/image/harries_2.png)\n",
    "图中W函数表示窗口函数，M矩阵为偏导数矩阵，对于矩阵可以进行对称矩阵的变化，假设利用两个特征值进行替代，在椭圆模型中通过判断两个特征值的大小，来判定像素的属性。\n",
    "![Harries灰度积分变化的椭圆模拟](https://gitee.com/coolhenry/cv-week-2/raw/master/image/harries_3.png)\n",
    "M为梯度的协方差矩阵，在实际应用中为了能够应用更好的编程，定义了角点响应函数R，通过判定R的大小，来判断像素是否为角点。\n",
    "\n",
    "角点响应函数\n",
    "R = det M - k(trace M)^2\n",
    "其中\n",
    "det M = λ(1)λ(2)\n",
    "trace M = λ(1) + λ(2)\n",
    "k ~= [0.04,0.06]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. 简述Hough变换的基本原理(包括参数空间变换及参数空间划分网格统计)。 \n",
    "Hough变换的基本原理，是将灰度值分布(x,y)转化到极坐标系下\n",
    "\n",
    "参数空间变换如下:\n",
    "y = kx + b\n",
    "转化为\n",
    "xcosθ+ysinθ=ρ\n",
    "\n",
    "然后依据参数空间变换的性质:\n",
    "+ 直角坐标系下的一条直线(k,b), 对应于极坐标系下的一个点(ρ,θ)\n",
    "+ 直角坐标系下的一个点(x,y)，对应极坐标系下的一条正弦曲线 ρ = xcosθ + ysinθ\n",
    "+ 直角坐标系下同一条直线上的多个点，对应的极坐标系下的多条直线必相交于一点\n",
    "\n",
    "推论:\n",
    "极坐标系下某一点对应的原图像素点越多，那么越有可能对应原图中的一条直线；相反，对应的原图像素点越少的极坐标点，可能对应原图中的一些孤立的点或者噪声。\n",
    "\n",
    "Hough变换的步骤:\n",
    "+ 将(ρ,θ)空间量化成一些小格, 其中θ~[0,2π]\n",
    "+ 根据x-y平面每个像素点带入θ的量化值，算出对应的各个ρ，累计对应小格的计数;\n",
    "+ 当全部像素点都变换完毕后，对小格进行检验。设置累计阈值T,计数大于T的小格对应于共线点，可以用来拟合直线；计数小于T的对应于非共线点，丢弃不用。\n",
    "\n",
    "这里之所以进行极坐标变换，是因为极坐标系下θ~[0,2π]是有限取值范围，便于离散化处理，进而简化编程实现。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. 简述SIFT原理(重点是尺度空间和方向直方图原理)及ORB算子原理(重点是FAST和BRIEF)。 \n",
    "#### SIFT原理\n",
    "SIFT的流程为:\n",
    "+ 引入尺度概念，并通过连续变化尺度参数值，获得多尺度下的尺度空间表示序列\n",
    "+ 构建高斯金字塔\n",
    "+ 构建高斯差分金字塔\n",
    "+ 通过子像素差值法得到连续空间下的关键点定位\n",
    "+ 消除DoG导致的不稳定边缘响应点\n",
    "+ 通过总结关键点的方向分布，得到方向直方图，这样对于每个关键点，拥有了<位置,尺度,方向>三个信息\n",
    "+ 最终得到对应每个关键点的128维向量概述。\n",
    "\n",
    "尺度空间：\n",
    "+ 概念\n",
    "人眼通过自动调节尺度，得到物体由粗略到精细的信息的检测和识别，通过模拟人眼的这一过程，添加了尺度这一维度，计算机得到一张图像的由大到小(对应模糊程度由大到小)不同尺度的信息，进而构成尺度空间。\n",
    "+ 高斯金字塔构建过程\n",
    "\t+ 将原图像不断降阶采样(隔点采样)，得到一系列大小不一的图像, 序号记为o(Octave)，数量为\n",
    "\t\tn = log[min(M,N) - t], \n",
    "\t其中M,N为原图像的大小，t为塔顶图像的最小维数的对数值，如M=N=512的图像，当塔顶图像为4*4时，n=7;当塔顶图像为2*2时，n=8.\n",
    "\t+ 然后将每张图像使用不同参数进行高斯模糊，这样对于指定大小的图像，得到多层图像, 层数记为s(Interval)\n",
    "\t+ 对于每层图像，与原图像进行卷积，得到尺度空间内指定坐标(x, y, σ)处的像素值.\n",
    "\t\tL(x,y,σ) = G(x, y, σ) * I(x, y)\n",
    "\t\tG(x, y, σ) = (1 / (2π σ^2))exp([(x - m / 2)^2 + (y - n / 2)^2] / [2σ^2])\n",
    "\t\tσ = σ(0) * 2 ^ (o + s / S)\n",
    "\t其中, σ(0)是基准尺度，o为组(Octave)序号, s为组内层s(Interval)的序号\n",
    "\t这样，就构造了一个(x, y, σ)的一个尺度空间。其中x~[0, M], y ~ [0, N], σ~[0, (S+3)*O]\n",
    "\n",
    "+ 使用高斯差分算子来求极值的理论证明\n",
    "推导目标：使用高斯差分算子来求极值。\n",
    "推导过程:\n",
    "为了求取尺度空间的极值，可以通过求取尺度归一化的高斯拉普拉斯算子的极大值和极小值来获得,\n",
    "LoG算子展开:\n",
    "![LoG算子展开](https://gitee.com/coolhenry/cv-week-2/raw/master/image/log_2.png)\n",
    "LoG算子归一化\n",
    "![LoG算子归一化](https://gitee.com/coolhenry/cv-week-2/raw/master/image/log_3.png)\n",
    "DoG即对不同尺度下的高斯函数的差分\n",
    "![DoG算子](https://gitee.com/coolhenry/cv-week-2/raw/master/image/dog.png)\n",
    "推导出:\n",
    "![高斯差分](https://gitee.com/coolhenry/cv-week-2/raw/master/image/g_delta.png)\n",
    "即：即DoG算子和LoG算子具有类似的波形，仅仅是幅度不同，不影响极值点的检测，而DoG算子的计算复杂度显然低于LoG，因此一般使用DoG代替LoG算子\n",
    "因此: D(x, y, σ) = [G(x, y, kσ) - G(x, y, σ)] * I(x, y) = L(x, y, kσ) - L(x, y, σ)\n",
    "其中，I(x, y)为原图像对应(x, y)坐标的灰度值, L(x, y, σ)为尺度空间下对应(x, y, σ)坐标的灰度值.\n",
    "\n",
    "+ 高斯差分(DoG)金字塔的构建过程\n",
    "\t+ 使用高斯金字塔每组中上下两层图像相减，得到高斯差分图像，每个点可表示为D(x, y, σ)；\n",
    "\t+ 为了求D(x, y, σ)的极值点，每个像素点需要和它周围所有的相邻点比较，看其是否比它的图像域和尺度域的相邻点大或小，\n",
    "\t即，中间的检测点和它同尺度的8个相邻点，和它尺度域上下的9*2个相邻点，共计26个点比较，以确保在尺度空间和二维图像空间都检测到极值点；\n",
    "\t+ 为了保证处于组内上下边缘的层也能在组内检测到极值点，需要一上一下再加2层；又由于DoG金字塔由高斯金字塔相邻两层得到，所以需要再加1层，共计S+3层图像\n",
    "\t其中\n",
    "\t\t第0组  0  1  2  3  4  5\n",
    "\t\t第1组  6  7  8  9  10 11\n",
    "\t\t第2组  12 13 14 15 16 17\n",
    "\t即第2组的第一层12，是根据第1组的倒数第3层9经过降采样得到.\n",
    "\tD(x, y, σ) = [G(x, y, σ(s + 1)) - G(x, y, σ(s))] * I(x, y) = L(x, y, σ(s + 1)) - L(x, y, σ(s))\n",
    "\n",
    "+ 关键点定位（子像素插值）\n",
    "通过上述过程求取的离散极值点，在泰勒级数展开后忽略三阶及以上求导的项之后的函数D(x), 令D(x)一阶求导结果为0，得到极值点偏移量，\n",
    "然后通过检测偏移量在另外两个尺度坐标下的偏移量，来调整插值的位置，直到收敛。并且在过程中删除\n",
    "\t+ 超过迭代次数的插值\n",
    "\t+ 极值点偏移量小于某个经验值(如0.03或0.04/S)的插值\n",
    "最终收获了精确的插值.\n",
    "\n",
    "+ 剔除边缘响应点\n",
    "用到了前面Harries角点检测中的方法，通过设定Hession矩阵的两个特征值的比值r的阈值为10，来筛选掉 (r+1)^2 / r>=10的点，认为这些点属于边缘点。\n",
    "\n",
    "+ 关键点的特征描述\n",
    "\t+ 为了让特征描述具有几何变换里的旋转不变性，需要利用图像的局部特征，为每个关键点分配一个基准方向，使用图像梯度的方法，求取局部结构的稳定方向。\n",
    "\t  对于在DoG金字塔中检测出的关键点，采集其所在高斯金字塔图像3σ邻域窗口内像素的梯度和方向分布特征，梯度的模值和方向如下:\n",
    "\t\tm(x, y) = [(L(x + 1, y) - L(x - 1, y)) ^ 2 + (L(x, y + 1) - L(x, y - 1)) ^ 2]^(1/2)\n",
    "\t\tθ(x, y) = arctan[(L(x, y + 1) - L(x, y - 1)) / (L(x + 1, y) - L(x - 1, y))]\n",
    "\t其中，L为关键点所在的尺度空间值。\n",
    "\n",
    "+ 方向直方图的生成\n",
    "直方图的统计半径为3 * 1.5σ，即计算以关键点为中心，半径为3 * 1.5σ邻域内所有点的梯度方向。\n",
    "梯度直方图将0~360度的方向范围分为10个柱，每36度一个柱，纵轴是梯度方向对应梯度赋值的加权累加。\n",
    "将梯度方向直方图中纵坐标最大的项代表的方向分配给当前关键点作为主方向，若在梯度直方图中存在一个相当于主峰值80%能量的峰值，则将这个方向认为是关键点的辅方向，辅方向的设计可以增强匹配的鲁棒性，大约15%的关键点拥有辅方向。\n",
    "\n",
    "+ 生成图像特征描述子\n",
    "对于每个关键点，拥有<位置，尺度，方向>三个维度的信息，用一组向量将这个关键点描述出来，使其不随各种几何变换而变化。这个描述子不仅包含关键点的信息，也包含关键点周围对其有贡献的像素点，并且描述子应该具有较高的独特性，以便于提高特征点正确匹配概率。\n",
    "生成步骤：\n",
    "\t+ 校正旋转主方向;\n",
    "\t+ 旋转后，对每个像素点求梯度幅值和方向，利用高斯窗口加权，最后在4*4的窗口中，绘制8个方向的梯度直方图，最终生成一个128维的特征向量;\n",
    "\t+ 将特征向量长度进行归一化处理 L(i) = H(i) / (128个H分量之和开平方根)\n",
    "\n",
    "#### ORB原理\n",
    "+ 概述\n",
    "ORB基本原理是将FAST特征点的检测方法和BRIEF特征描述子结合起来，并在它们原来的基础上做了改进和优化。ORB算法最大的特点是计算速度快，这首先得益于使用FAST检测特征点，再次是使用BRIEF算法计算描述子，该描述子特有的二进制串的表现形式不仅节约了存储空间，也大大缩短了匹配的时间。\n",
    "\n",
    "+ 特征检测\n",
    "FAST基于特征点周围的像素灰度值，检测候选点周围一圈的像素值，如果候选点周围邻域内有足够多的像素点与该候选点的灰度值差别够大，则认为该候选点为一个特征点。候选点周围的圆的选取半径是一个很重要的参数，如果采用半径3，则共有16个周边像素需要比较。\n",
    "![FAST候选点周边圆选取](https://gitee.com/coolhenry/cv-week-2/raw/master/image/fast_1.png)\n",
    "圆周上如果有连续n个像素点的灰度值都比P点的灰度值大(小)，则认为P为特征点, 一般P=12. 假设在图像中要提取N个特征点，则降低FAST的阈值，使得FAST算法检测到的特征点大于N,然后再特征点处，计算特征点的Harries响应值R, 取前N个响应值大的点作为FAST特征点。为了加快特征点的提取，快速排出非特征点，首先检测1, 5, 9, 13位置上的灰度值，如果P是特征点，那么这四个位置上有3个或3个以上的像素值都大于(小于)P的灰度值，如果不满足，则直接排除此点。\n",
    "FAST算法提取出的特征点不具有尺度不变性，这导致图像经过缩放后无法匹配到相应的特征点。为了改进这一点，需要使用图片的尺度金字塔，在不同尺度计算FAST特征点。具体做法为设置一个比例因子scaleFactor(通常1.2)和金字塔的层数nLevels(通常8)，将原图像按比例因子缩小成nLevels幅图像，缩放后的图像为: I' = I / scaleFactor (k = 1, 2, ..., nLevels). nLevels幅不同比例的图像提取特征点总和作为这幅图像的oFAST特征点。\n",
    "\n",
    "+ 特征描述\n",
    "ORB采用BRIEF算法来计算一个特征点的描述子，它得出的是一个二进制串的特征描述符。它是在每个特征点的邻域内，选择n对像素点pi,qi(i = 1, 2, ..., n)， 然后比较每个点对的灰度值的大小。如果I(pi) > I(qi)， 则生成二进制串中的1，否则为0.所有的点对进行比较，则生成长度为n的二进制串，一般n取128,256或512.\n",
    "![BRIEF候选点周边圆选取](https://gitee.com/coolhenry/cv-week-2/raw/master/image/brief.png)\n",
    "由于BRIEF不具有旋转不变性，于是采用rBRIEF进行改进。在计算BRIEF描述子时建立的坐标系是以特征点为圆心，以特征点和取点区域的质心的连线作为X轴建立二维坐标系，这样一来，无论图像如何旋转，ORB选取点对的坐标系是固定的。在不同的旋转角下，我们以同一取点模式取出来的点是一致的。这就解决了旋转一致性的问题。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
